#ifndef SYMBOL_TABLE_H_
#define SYMBOL_TABLE_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "syntaxTree.h"
#include "base.h"

# define YYTOKENTYPE
   enum yytokentype {
     T_PROGRAMA = 258,
     T_FUNCAO = 259,
     T_PROCEDIMENTO = 260,
     T_INTEIRO = 261,
     T_TEXTO = 262,
     T_INICIO = 263,
     T_FIM = 264,
     T_IDENTIFICADOR = 265,
     T_VAR = 266,
     T_TIPO = 267,
     T_PACKED = 268,
     T_PARENTESES_A = 269,
     T_PARENTESES_F = 270,
     T_VIRGULA = 271,
     T_INTEIRO_SEM_SINAL = 272,
     T_REAL_SEM_SINAL = 273,
     T_CONSTANTE = 274,
     T_PONTO = 275,
     T_PONTO_VIRGULA = 276,
     T_PARA = 277,
     T_INCREMENTA = 278,
     T_DECREMENTA = 279,
     T_ENQUANTO = 280,
     T_FACA = 281,
     T_REPITA = 282,
     T_ATE = 283,
     T_DOIS_PONTOS = 284,
     T_REGISTRO = 285,
     T_DE = 286,
     T_SE = 287,
     T_ENTAO = 288,
     T_SENAO = 289,
     T_ATRIBUIR = 290,
     T_ARQUIVO = 291,
     T_COLCHETE_A = 292,
     T_COLCHETE_F = 293,
     T_MATRIZ = 294,
     T_OP_ATRIBUICAO = 295,
     T_OP_MAIOR = 296,
     T_OP_MENOR = 297,
     T_OP_MAIORIGUAL = 298,
     T_OP_MENORIGUAL = 299,
     T_OP_IGUAL = 300,
     T_OP_DIFERENTE = 301,
     T_OP_DIVISAO = 302,
     T_OP_MULTIPLICACAO = 303,
     T_OP_SUBTRACAO = 304,
     T_OP_E = 305,
     T_OP_OU = 306,
     T_OP_NAO = 307,
     T_OP_DIV = 308,
     T_OP_MOD = 309,
     T_OP_ADICAO = 310
   };

typedef struct SYMBOL {
	char name[64];
	int level;
	t_kind kind;
	t_types type;
	t_position pos;
	t_values value;
	struct SYMBOLTABLE *next;
	struct SYMBOLTABLE *prev;
} Symbol;

Symbol *head;

Symbol* symbol_new();
int symbol_isEmpty(Symbol *table);
Symbol* symbol_search(Symbol *table, char *name);
int symbol_isAdded(char str[64]);
void symbol_addFromNode(Symbol **table, TreeNode *node, TreeNode *type);
int symbol_add(Symbol **table, char name[64]);
t_types symbol_getType(Symbol *p);
t_types symbol_getTypeByName(Symbol *table, char *name);
int symbol_sameType(Symbol *p1, Symbol *p2);
int symbol_sameTypeByName(Symbol *table, char *name1, char *name2);
void symbol_print(Symbol *symbol);
void symbol_printTable(Symbol *table);


#endif
